package com.example.cloud.feign.config;

import com.example.cloud.feign.service.HttpService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatusCode;
import org.springframework.web.client.RestClient;
import org.springframework.web.client.support.RestClientAdapter;
import org.springframework.web.service.invoker.HttpServiceProxyFactory;

@Configuration
public class HttpConfig {

    // 定制化 RestClient 供所有 Java 服务接口使用。对于 WebClient 同理
    @Bean
    public RestClient restClient() {
        // 创建一个 RestClient 实例
        return RestClient.builder()
                .baseUrl("https://api.github.com/")
                // 对于 RestClient，默认情况下，RestClient 会针对 4xx 和 5xx HTTP 状态码抛出 RestClientException。要自定义此行为，
                // 请注册一个响应状态处理程序，该处理程序适用于通过客户端执行的所有响应。
                // .defaultStatusHandler(HttpStatusCode::isError, (request, response) -> {})
                .build();
    }

    // 现在您可以创建一个 RestClient 代理，在调用方法时执行请求。
    // 现在，我们可以将客户端代理实例注册为 Spring Bean 或组件，并用它请求 REST 服务。
    @Bean
    public HttpService httpService(RestClient restClient) {
        RestClientAdapter adapter = RestClientAdapter.create(restClient);
        HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();

        return factory.createClient(HttpService.class);
    }

    // 如果还有其他 HTTP 接口，您可以重复注册 HttpService 接口代理实现此过程。
}

// 关于配置和使用 HTTP 接口 参考官网 https://docs.springjava.cn/spring-framework/reference/integration/rest-clients.html#rest-http-interface
// Spring 框架允许您使用带 @HttpExchange 方法的 Java 接口来定义 HTTP 服务。您可以将此类接口传递给 HttpServiceProxyFactory 以创建代理，
// 该代理通过 HTTP 客户端（如 RestClient 或 WebClient）执行请求。您也可以从 @Controller 实现接口以进行服务器请求处理。